/**
 * 
 */
package featureautomate.tools;

import java.util.ArrayList;


import org.xtext.lts.*;

import featureautomate.structure.Automate;


/**
 * @author D.Abdelali
 *
 */
public class AdapterAutomate {
	
	
	/*
	
	public static Statemachine compose(Statemachine sta, Statemachine stb){
		
		if(sta == null){
			return stb;
		}
		
		if(stb == null){
			return sta;
		}
		
	
		int j =0;
		while(j< stb.getEvents().size()){
			System.out.println("ev - "+" "+stb.getEvents().get(j));
			sta.getEvents().add(stb.getEvents().get(j));
			j = j+1;
		}
		

		
		boolean cond = false;
		for(State s : stb.getStates()){
			cond = false;
			if(s.equals(stb.getInit())){
				cond = true;
			}
			for (State fin : stb.getFinal()){
					if(s.equals(fin)){
						cond = true;
					}
			}
			
			if(!cond){
				sta.getStates().add(s);
			}
		}

		
		for (State s : stb.getStates()){
			if(s.equals(stb.getInit())){
	
				
				for(int i=0; i<s.getTransitions().size();i++){
					sta.getInit().getTransitions().add(s.getTransitions().get(i));
					
				}
			
			}
		}
		
		
		for (State s : sta.getStates()){
			
			for(Transition tr : s.getTransitions()){
				cond = false;
				for(State sbfin : stb.getFinal()){
					if(sbfin.equals(tr.getState())){
						cond = true;
					}
				}
				if(cond){
					tr.setState(sta.getFinal().get(0));
					cond = false;
				}
			}
		}
	
			
	
		
		return sta;
	}

	
	public static Statemachine sequence(Statemachine sta, Statemachine stb){
		
		if(sta == null){
			return stb;
		}
		
		if(stb == null){
			return sta;
		}
		ArrayList<State> tmp = new ArrayList<>();
		for( State sa : sta.getFinal() ){
		tmp.add(sa);
		}
		
		for (State sa : tmp){
			for(Transition t : stb.getInit().getTransitions()){
				sa.getTransitions().add(t);
			}
		}
		
		for (int i=0;i<stb.getStates().size();i++){
			State s = stb.getStates().get(i);
			if(!s.equals(stb.getInit())){
				sta.getStates().add(s);
			}
		}
		
	
		for (int i=0; i< stb.getEvents().size();i++){
			sta.getEvents().add(stb.getEvents().get(i));
		}
		
		
		for (Service sr : stb.getServices()){
			sta.getServices().add(sr);
		}
		
		sta.getFinal().clear();
		if(sta.getFinal().isEmpty()){
			for (State s : stb.getFinal()){
				sta.getFinal().add(s);
			}
		}else{
			System.out.println("erreur au niveau de suppression des Events finaux d'un automate");
		}
		return sta;
	
	}
	
	
	
	private static Statemachine deplieboucle(Statemachine s){
		for(State fin : s.getFinal()){
			if(fin.equals(s.getInit())){
				
			}
		}
		
		return null;
	}
	
	
	*/
	
	public static Automate adapterStatemachine(Statemachine st){
		Automate ret = new Automate() ;
		
		
		for(org.xtext.lts.Event  e : st.getEvents()){
			ret.addEvent(new featureautomate.structure.Event(e.getName(),e.isResetEvent()));
		}
		
		for(org.xtext.lts.Service  e : st.getServices()){
			//ret.addService(new featureautomate.structure.Service(e.getName(),e.getType()));
			ret.addService(new featureautomate.structure.Service(e.getName()));
			
		}
		
		for(org.xtext.lts.State s : st.getStates()){
			ret.addState(new featureautomate.structure.State(s.getName()));
		}
		
		
		ArrayList<featureautomate.structure.Transition> tr;
		for(org.xtext.lts.State s : st.getStates()){
			
			tr = new ArrayList<>();
			for(org.xtext.lts.Transition t : s.getTransitions()){
				tr.add(new featureautomate.structure.Transition(ret.getEvents().get(t.getEvent().getName()), ret.getStates().get(t.getState().getName())));
			}
			ret.getStates().get(s.getName()).setTransitions(tr);
			//ret.getStates().get(s.getName()).setAction(s.getAction().toString());
			ret.getStates().get(s.getName()).setAction("");
		}
		
		ret.setInit(ret.getStates().get(st.getInit().getName()));

		for(org.xtext.lts.State s : st.getFinal()){
				ret.addFinals(ret.getStates().get(s.getName()));
		}
		

		return ret;
	}
	
	

	public static String genererFileLts(Statemachine st){
		String ret = "" ;
		String newligne = System.getProperty("line.separator"); 
		
		ret += "events"+newligne;
		for(org.xtext.lts.Event  e : st.getEvents()){
			ret+=e.getName()+newligne;
		}
		ret+="end"+newligne+newligne;
		
		
		ret += "services"+newligne;
		for(org.xtext.lts.Service  e : st.getServices()){
			ret+=e.getName()+newligne;
		}
		ret+="end"+newligne+newligne;
		
		ret += "init : "+st.getInit().getName()+newligne+newligne;

		ret += "finals : ";
		for(org.xtext.lts.State s : st.getFinal()){
				ret+=s.getName()+" ";
		}
		
		ret+=newligne+newligne;
		
		for(org.xtext.lts.State s : st.getStates()){
			ret+="state "+s.getName()+newligne+" do{"+newligne;
			if(s.getAction() != null){
				ret += s.getAction().toString()+newligne;
			}
			ret+= " }"+newligne;
			for (org.xtext.lts.Transition tr : s.getTransitions()){
				ret += tr.getEvent().getName()+" => "+tr.getState().getName()+newligne;
			}
			ret +="end"+newligne+newligne;
		}
		
		
		return ret;
	}
	
}
